﻿using System;
using System.Collections.Generic;

namespace DimensionsHelper.Common.Contracts.Table;

public interface ILine : IEnumerable<ICell>
{
    /// <summary>
    ///     当前行的原始索引。
    /// </summary>
    int OriginalIndex { get; }

    /// <summary>
    ///     当前行中的单元格数量。
    /// </summary>
    int Count { get; }

    /// <summary>
    ///     指示当前行是否为空。
    ///     如果<see cref="Count" />为0或者所有单元格的<see cref="ICell.IsEmpty" />都为true，此处为true。
    /// </summary>
    bool IsEmpty { get; }

    /// <summary>
    ///     指示当前行是否被完全填充。
    ///     如果<see cref="Count" />大于0且所有单元格的<see cref="ICell.IsEmpty" />都为false，此处为true。
    /// </summary>
    bool IsFullFilled { get; }

    /// <summary>
    ///     获取指定索引位置的单元格对象。
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    ICell this[int index] { get; }

    /// <summary>
    ///     此行中文本内容不是空白的单元格数量。
    /// </summary>
    int NotEmptyCellCount { get; }

    /// <summary>
    ///     获取当前行的值列表。
    /// </summary>
    object[] Values { get; }

    /// <summary>
    ///     此行在表格中的类型。
    /// </summary>
    LineType LineType { get; }

    /// <summary>
    ///     此行的上一行，注意，此处指的是原始内容的上一行，修改表格中的行顺序，此处不应当发生变化。
    /// </summary>
    ILine? PreviousLine { get; }

    /// <summary>
    ///     此行的下一行，注意，此处指的是原始内容的上一行，修改表格中的行顺序，此处不应当发生变化。
    /// </summary>
    ILine? NextLine { get; }

    /// <summary>
    ///     和当前行关联的显著性结果行。
    /// </summary>
    ILine? RelativeSignificantTestLine { get; }

    /// <summary>
    ///     此行的第一个文本内容不为空的单元格。
    /// </summary>
    ICell? FirstNotEmptyCell { get; }

    /// <summary>
    ///     当前行所属表格，孤立行时，此属性是null。
    /// </summary>
    ITable? Table { get; }

    /// <summary>
    ///     对每个单元格的值调用回调函数，并将值填入列表返回。
    /// </summary>
    /// <param name="callback"></param>
    /// <returns></returns>
    object[,] SelectValues(Func<object, object> callback);

    /// <summary>
    ///     向行末尾添加一个新的单元格。
    /// </summary>
    /// <returns></returns>
    ICell Add();

    /// <summary>
    ///     向行末尾添加一个指定内容的单元格。
    /// </summary>
    /// <param name="text"></param>
    /// <returns></returns>
    ICell Add(string text);

    /// <summary>
    ///     移除行末尾的空白单元格。
    /// </summary>
    void RTrim();

    /// <summary>
    ///     判断指定类型是否符合当前行的类型。
    /// </summary>
    /// <param name="lineType"></param>
    /// <returns></returns>
    bool TestLineType(LineType lineType);
}